package com.study.gzh.panzhi.util;

import com.study.gzh.panzhi.util.BeanUtilDemo.DataDTO.UserInfo;
import lombok.Data;
import lombok.experimental.Accessors;
import org.junit.jupiter.api.Test;
import org.springframework.beans.BeanUtils;

import java.util.Arrays;
import java.util.Date;

import static java.io.File.separator;

;

/**
 * @author zhuzi
 * 2024/12/25 17:0
 * https://mp.weixin.qq.com/s/zy71C8Zt6gKvClKSMYXbXA
 * 属性拷贝对比
 */
public class BeanUtilDemo {

    /***
     * Apache BeanUtils 工具从操作使用上还是非常方便的，
     * 不过其底层源码为了追求完美，加了过多的包装，使用了很多反射，
     * 做了很多校验，导致属性复制时性能较差，
     * 因此阿里巴巴开发手册上强制规定避免使用 Apache BeanUtils。
     */
    @Test
    public void d1Apache() {
        // 原始对象
        UserInfo source = new UserInfo();
        // set...

        // 目标对象
        UserInfo target = new UserInfo();
        BeanUtils.copyProperties(target, source);
        System.out.println(target.toString());
    }

    @Test
    public void d2Spring() {
        // 原始对象
        UserInfo source = new UserInfo();
        // set...

        // 目标对象
        UserInfo target = new UserInfo();
        BeanUtils.copyProperties(source, target);
        System.out.println(target.toString());


        Arrays.asList("a", "b", "c").forEach(
                (String e) -> System.out.print(e + separator));
    }

    public interface DataDTO {

        @Data
        @Accessors(chain = true)
        class UserInfo {
            /**
             * 用户ID
             */
            private Long userId;

            /**
             * 用户名
             */
            private String userName;

            /**
             * 密码
             */
            private String userPwd;

            /**
             * 年龄
             */
            private Integer age;

            /**
             * 性别
             */
            private String gender;

            /**
             * 生日
             */
            private Date birthday;


            // ...set、get

            @Override
            public String toString() {
                return "UserInfo{" +
                        "userId=" + userId +
                        ", userName='" + userName + '\'' +
                        ", userPwd='" + userPwd + '\'' +
                        ", age=" + age +
                        ", gender='" + gender + '\'' +
                        ", birthday=" + birthday +
                        '}';
            }
        }
    }
}
